package main

import (
	"admin-go-api/common/config"
	_ "admin-go-api/docs"
	"admin-go-api/pkg/captcha"
	"admin-go-api/pkg/db"
	"admin-go-api/pkg/log"
	"admin-go-api/pkg/redis"
	"admin-go-api/router"
	"bytes"
	"fmt"
	"github.com/gin-gonic/gin"
	"golang.org/x/net/context"
	"net/http"
	"os"
	"os/exec"
	"os/signal"
	"time"
)

// @Title 后台管理
// @Version 1.0
// @Description API接口文档
// @SecurityDefinitions.apikey ApiKeyAuth
// @In header
// @Name Authorization
// 函数是 Go 语言程序的默认入口点
// 在所有包的init函数执行完毕后，才会执行main函数
func main() {
	runCommand()
	//加载日志
	log := log.Log()
	//	启动模式
	gin.SetMode(config.Config.Server.Model)
	router := router.InitRouter()
	srv := &http.Server{
		Addr:    config.Config.Server.Address,
		Handler: router,
	}
	//	启动服务
	go func() {
		//监听端口并启动服务
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Info("listen: %s\n", err)
		}
		log.Info("listen: %s\n", config.Config.Server.Address)
	}()
	quit := make(chan os.Signal)
	//	监听消息
	signal.Notify(quit, os.Interrupt)
	<-quit
	log.Info("Shutdown Server ...")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Info("Server Shutdown:", err)
	}
	log.Info("Server exiting")
}

// 初始化连接
// 用于程序执行前对包进行初始化操作
// 函数不能有任何参数和返回值，且不能被其他函数调用，而是由 Go 程序自动调用
func init() {
	fmt.Println("===================")
	//	mysql
	db.SetupDBLink()
	//redis
	redis.SetupRedis()
	captcha.SetupCaptcha()
}
func runCommand() {
	cmd := exec.Command("swag", "init")
	fmt.Println("Cmd", cmd.Args)
	var out bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = os.Stderr
	err := cmd.Start()
	if err != nil {
		fmt.Println(err)
		fmt.Println(out.String())
	}
}
